package com.leetcode.easy;

/**
 * @Classname SolutionAddBinary
 * @Description TODO
 * @Date 2020/8/24 16:49
 * @Created by zfl
 */
public class SolutionAddBinary {
    /*
    *@Description 暴力法
    *@param [a, b]
    *@return java.lang.String
    * 执行用时：9 ms, 在所有 Java 提交中击败了8.46%的用户
    * 内存消耗：40.4 MB, 在所有 Java 提交中击败了5.10%的用户
    */
    public String addBinary(String a, String b) {
        if(a.equals("0")) return b;
        if(b.equals("0")) return a;
        int carry = 0;
        String str = "";
        int i = a.length() - 1;
        int j = b.length() - 1;
        while (i >= 0 && j >= 0) {
            str = (carry + (int)a.charAt(i) + (int)b.charAt(j) - 96) % 2 + str;
            carry = (carry + (int)a.charAt(i) + (int)b.charAt(j) - 96) / 2;
            i--;
            j--;
        }
        while (i >=0 || j >= 0) {
            if(i >= 0 && j < 0) {
                str = (carry + (int)a.charAt(i) - 48) % 2 + str;
                carry = (carry + (int)a.charAt(i) - 48) / 2;
                i--;
            }else if(i < 0 && j >= 0) {
                str = (carry + (int)b.charAt(j) - 48) % 2 + str;
                carry = (carry + (int)b.charAt(j) - 48) / 2;
                j--;
            }
        }
        if(carry > 0) {
            str = carry + str;
        }
        return str;
    }
    /*
    *@Description 整体思路是将两个字符串较短的用 00 补齐，使得两个字符串长度一致，然后从末尾进行遍历计算，得到最终结果。
    *@param [a, b]
    *@return java.lang.String
    * 执行用时：3 ms, 在所有 Java 提交中击败了60.60%的用户
    * 内存消耗：38.2 MB, 在所有 Java 提交中击败了87.93%的用户
    */
    public String addBinary2(String a,  String b) {
        StringBuilder s = new StringBuilder();
        int carry = 0, sum = 0;
        for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0 ; i--, j--) {
            sum = carry;
            sum += i >= 0 ? a.charAt(i) - '0' : 0;
            sum += j >= 0 ? b.charAt(j) - '0' : 0;
            s.append(sum % 2);
            carry = sum / 2;
        }
        s.append(carry > 0 ? carry : "");
        //反序
        return s.reverse().toString();
    }
    /*
    *@Description 先把二进制转化为十进制，相加，然后再转化为二进制
    *@param [a, b]
    *@return java.lang.String
    */
    public String addBinary3(String a, String b) {
        return Integer.toBinaryString(Integer.parseInt(a, 2) + Integer.parseInt(b, 2));
    }
}
